package org.moonlight.jvm.classfile.attribute.debuginfo;

import org.moonlight.jvm.classfile.ClassReader;
import org.moonlight.jvm.classfile.attribute.AttributeInfo;
import org.moonlight.jvm.classfile.constant.StaticConstantPool;

/**
 * SourceFile是可选定长属性，只会出现在ClassFile结构中，用于指出源文件名。属于调试信息，不是运行时必需的。其结构定义如下：
 *   SourceFile_attribute {
 *       u2  attribute_name_index
 *       u4  attribute_length
 *       u2  sourcefile_index
 *   }
 *
 *   attribute_length的值必须是2。sourcefile_index是 静态常量池索引，指向 CONSTANT_Utf8_info 常量。
 *
 * @author Moonlight
 * @createTime 2023/8/15 16:17
 **/
public class SourceFileAttribute implements AttributeInfo {

    private final StaticConstantPool scp;
    private int sourceFileIdx;

    public SourceFileAttribute(StaticConstantPool scp) {
        this.scp = scp;
    }

    @Override
    public void readInfo(ClassReader reader) {
        this.sourceFileIdx = reader.readUint16();
    }

    public String fileName() {
        return this.scp.getUtf8(this.sourceFileIdx);
    }

    @Override
    public String toString() {
        return "SourceFileAttribute{" +
                "sourceFileIdx=" + this.sourceFileIdx +
                ", fileName=" + this.fileName() +
                '}';
    }
}